diff --git a/src/math.jl b/src/math.jl
index 4662ab02..736aeacf 100644
--- a/src/math.jl
+++ b/src/math.jl
@@ -16,8 +16,28 @@ Base.:/(l::Number, r::Quantity) = l * inv(r)
 Base.:/(l::Dimensions, r::Number) = Quantity(inv(r), l)
 Base.:/(l::Number, r::Dimensions) = Quantity(l, inv(r))
 
-Base.:+(l::Quantity, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l.value + r.value, l.dimensions) : throw(DimensionError(l, r))
-Base.:-(l::Quantity, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l.value - r.value, l.dimensions) : throw(DimensionError(l, r))
+function Base.:+(l::Quantity, r::Quantity)
+    if iszero(l)
+        return r
+    elseif iszero(r)
+        return l
+    else
+        l.dimensions == r.dimensions ? Quantity(l.value + r.value, l.dimensions) : throw(DimensionError(l, r))
+    end
+end
+
+
+function Base.:-(l::Quantity, r::Quantity)
+    if iszero(l)
+        return -r
+    elseif iszero(r)
+        return l
+    else
+        l.dimensions == r.dimensions ?  Quantity(l.value - r.value, l.dimensions) :  throw(DimensionError(l, r))
+    end
+end
+
+Base.:-(l::Quantity) =  Quantity(- l.value, l.dimensions)
 
 _pow(l::Dimensions{R}, r::R) where {R} = @map_dimensions(Base.Fix1(*, r), l)
 _pow(l::Quantity{T,R}, r::R) where {T,R} = Quantity(l.value^convert(T, r), _pow(l.dimensions, r))
@@ -32,4 +52,16 @@ Base.sqrt(q::Quantity) = Quantity(sqrt(q.value), sqrt(q.dimensions))
 Base.cbrt(d::Dimensions{R}) where {R} = d^inv(convert(R, 3))
 Base.cbrt(q::Quantity) = Quantity(cbrt(q.value), cbrt(q.dimensions))
 
-Base.abs(q::Quantity) = Quantity(abs(q.value), q.dimensions)
+
+#
+# We need this for pivoting: we could introduce a pivoting type RowNonZero instead.
+# 
+#Base.abs(q::Quantity) = Quantity(abs(q.value), q.dimensions, q.valid)
+Base.abs(q::Quantity) = Quantity(abs(q.value))
+
+
+Base.iszero(d::Dimensions) = d==Dimensions()
+Base.isless(q::Quantity,r::Quantity) =  q.value<r.value && q.dimensions==r.dimensions
+Base.isone(q::Quantity{T}) where T =   isone(q.value) && iszero(q.dimensions)
+Base.iszero(q::Quantity{T}) where T  =  iszero(q.value)
+
diff --git a/test/linsolve.jl b/test/linsolve.jl
new file mode 100644
index 00000000..efdcb263
--- /dev/null
+++ b/test/linsolve.jl
@@ -0,0 +1,27 @@
+module linsolve
+
+
+using SparseArrays,Sparspak,DynamicQuantities, LinearAlgebra
+using GenericLinearAlgebra
+
+function makeproblem(n;dimA=DynamicQuantities.Dimensions(length=1),dimb=DynamicQuantities.Dimensions(tim=1))
+    A=-sprand(n,n,0.5)+100I
+    SparseMatrixCSC(size(A)...,A.colptr,A.rowval,Quantity.(A.nzval,dimA)), Quantity.(rand(n),dimb)
+    
+#    [ Quantity(b0[i],length=1) for i=1:n]
+    #DynamicQuantities.Quantity.(rand(10),time=1)
+end
+
+
+function densetest(n)
+    As,b=makeproblem(n)
+    A=Matrix(As)
+    lu(A)\b
+end
+
+function sparsetest(n)
+    A,b=makeproblem(n)
+    sparspaklu(A)\b
+end
+
+end