diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index e0e8afa..3d7d496 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -64,7 +64,6 @@
     local_parameterization.cc
     loss_function.cc
     normal_prior.cc
-    ordering.cc
     partitioned_matrix_view.cc
     polynomial_solver.cc
     problem.cc
@@ -234,7 +233,6 @@
   CERES_TEST(minimizer)
   CERES_TEST(normal_prior)
   CERES_TEST(numeric_diff_cost_function)
-  CERES_TEST(ordering)
   CERES_TEST(ordered_groups)
   CERES_TEST(parameter_block)
   CERES_TEST(partitioned_matrix_view)
diff --git a/internal/ceres/inner_iteration_minimizer.cc b/internal/ceres/inner_iteration_minimizer.cc
index 6a9b419..36748ef 100644
--- a/internal/ceres/inner_iteration_minimizer.cc
+++ b/internal/ceres/inner_iteration_minimizer.cc
@@ -35,7 +35,7 @@
 #include "ceres/evaluator.h"
 #include "ceres/linear_solver.h"
 #include "ceres/minimizer.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/parameter_block.h"
 #include "ceres/problem_impl.h"
 #include "ceres/program.h"
@@ -58,7 +58,7 @@
                                    string* error) {
   program_.reset(new Program(outer_program));
 
-  Ordering ordering;
+  ParameterBlockOrdering ordering;
   int num_inner_iteration_parameter_blocks = 0;
 
   if (parameter_blocks_for_inner_iterations.size() == 0) {
@@ -79,9 +79,9 @@
     for (int i = 0; i < parameter_block_ordering.size(); ++i) {
       double* ptr = parameter_block_ordering[i]->mutable_user_state();
       if (i < num_inner_iteration_parameter_blocks) {
-        ordering.AddParameterBlockToGroup(ptr, 0);
+        ordering.AddElementToGroup(ptr, 0);
       } else {
-        ordering.AddParameterBlockToGroup(ptr, 1);
+        ordering.AddElementToGroup(ptr, 1);
       }
     }
   } else {
@@ -95,18 +95,18 @@
     for (int i = 0; i < parameter_blocks.size(); ++i) {
       double* ptr = parameter_blocks[i]->mutable_user_state();
       if (parameter_block_ptrs.count(ptr) != 0) {
-        ordering.AddParameterBlockToGroup(ptr, 0);
+        ordering.AddElementToGroup(ptr, 0);
       } else {
-        ordering.AddParameterBlockToGroup(ptr, 1);
+        ordering.AddElementToGroup(ptr, 1);
       }
     }
 
     num_inner_iteration_parameter_blocks = ordering.GroupSize(0);
     if (num_inner_iteration_parameter_blocks > 0) {
-      const map<int, set<double*> >& group_id_to_parameter_blocks =
-          ordering.group_id_to_parameter_blocks();
+      const map<int, set<double*> >& group_to_elements =
+          ordering.group_to_elements();
       if (!SolverImpl::IsParameterBlockSetIndependent(
-              group_id_to_parameter_blocks.begin()->second,
+              group_to_elements.begin()->second,
               program_->residual_blocks())) {
         *error = "The user provided parameter_blocks_for_inner_iterations "
             "does not form an independent set";
diff --git a/internal/ceres/ordering.cc b/internal/ceres/ordering.cc
deleted file mode 100644
index 4b3ec25..0000000
--- a/internal/ceres/ordering.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-//   this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-//   this list of conditions and the following disclaimer in the documentation
-//   and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-//   used to endorse or promote products derived from this software without
-//   specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#include <map>
-#include <set>
-#include "ceres/internal/port.h"
-#include "ceres/ordering.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-void Ordering::AddParameterBlockToGroup(double* parameter_block, int group_id) {
-  const map<double*, int>::const_iterator it =
-      parameter_block_to_group_id_.find(parameter_block);
-
-  if (it != parameter_block_to_group_id_.end()) {
-    group_id_to_parameter_blocks_[it->second].erase(parameter_block);
-    if (group_id_to_parameter_blocks_[it->second].size() == 0) {
-      group_id_to_parameter_blocks_.erase(it->second);
-    }
-  }
-
-  parameter_block_to_group_id_[parameter_block] = group_id;
-  group_id_to_parameter_blocks_[group_id].insert(parameter_block);
-}
-
-void Ordering::RemoveParameterBlock(double* parameter_block) {
-  const int current_group_id = GroupIdForParameterBlock(parameter_block);
-  group_id_to_parameter_blocks_[current_group_id].erase(parameter_block);
-  if (group_id_to_parameter_blocks_[current_group_id].size() == 0) {
-    group_id_to_parameter_blocks_.erase(current_group_id);
-  }
-
-  parameter_block_to_group_id_.erase(parameter_block);
-}
-
-int Ordering::GroupIdForParameterBlock(double* parameter_block) const {
-  const map<double*, int>::const_iterator it =
-      parameter_block_to_group_id_.find(parameter_block);
-  CHECK(it !=  parameter_block_to_group_id_.end())
-      << "Tried finding the group id of a parameter block unknown to "
-      << "the ordering: " << parameter_block;
-  return it->second;
-}
-
-bool Ordering::ContainsParameterBlock(double* parameter_block) const {
-  const map<double*, int>::const_iterator it =
-      parameter_block_to_group_id_.find(parameter_block);
-  return (it != parameter_block_to_group_id_.end());
-}
-
-int Ordering::NumParameterBlocks() const {
-  return parameter_block_to_group_id_.size();
-}
-
-int Ordering::NumGroups() const { return group_id_to_parameter_blocks_.size(); }
-
-int Ordering::GroupSize(int group_id) const {
-  map<int, set<double*> >::const_iterator it =
-      group_id_to_parameter_blocks_.find(group_id);
-  return (it ==  group_id_to_parameter_blocks_.end()) ? 0 : it->second.size();
-}
-
-const map<int, set<double*> >& Ordering::group_id_to_parameter_blocks() const {
-  return group_id_to_parameter_blocks_;
-}
-
-}  // namespace ceres
diff --git a/internal/ceres/ordering_test.cc b/internal/ceres/ordering_test.cc
deleted file mode 100644
index 9bd43b3..0000000
--- a/internal/ceres/ordering_test.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-//   this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-//   this list of conditions and the following disclaimer in the documentation
-//   and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-//   used to endorse or promote products derived from this software without
-//   specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#include "ceres/ordering.h"
-
-#include <cstddef>
-#include <vector>
-#include "gtest/gtest.h"
-#include "ceres/collections_port.h"
-
-namespace ceres {
-namespace internal {
-
-TEST(Ordering, EmptyOrderingBehavesCorrectly) {
-  Ordering ordering;
-  EXPECT_EQ(ordering.NumGroups(), 0);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 0);
-  EXPECT_EQ(ordering.GroupSize(1), 0);
-  double x;
-  EXPECT_DEATH_IF_SUPPORTED(ordering.GroupIdForParameterBlock(&x),
-                            "Tried finding");
-  EXPECT_DEATH_IF_SUPPORTED(ordering.RemoveParameterBlock(&x),
-                            "Tried finding");
-}
-
-TEST(Ordering, EverythingInOneGroup) {
-  Ordering ordering;
-  double x[3];
-  ordering.AddParameterBlockToGroup(x, 1);
-  ordering.AddParameterBlockToGroup(x + 1, 1);
-  ordering.AddParameterBlockToGroup(x + 2, 1);
-  ordering.AddParameterBlockToGroup(x, 1);
-
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-
-  ordering.RemoveParameterBlock(x);
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 2);
-  EXPECT_EQ(ordering.GroupSize(1), 2);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-
-  EXPECT_DEATH_IF_SUPPORTED(ordering.GroupIdForParameterBlock(x),
-                            "Tried finding");
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-}
-
-TEST(Ordering, StartInOneGroupAndThenSplit) {
-  Ordering ordering;
-  double x[3];
-  ordering.AddParameterBlockToGroup(x, 1);
-  ordering.AddParameterBlockToGroup(x + 1, 1);
-  ordering.AddParameterBlockToGroup(x + 2, 1);
-  ordering.AddParameterBlockToGroup(x, 1);
-
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-
-  ordering.AddParameterBlockToGroup(x, 5);
-  EXPECT_EQ(ordering.NumGroups(), 2);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 2);
-  EXPECT_EQ(ordering.GroupSize(5), 1);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 5);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-}
-
-TEST(Ordering, AddAndRemoveEveryThingFromOneGroup) {
-  Ordering ordering;
-  double x[3];
-  ordering.AddParameterBlockToGroup(x, 1);
-  ordering.AddParameterBlockToGroup(x + 1, 1);
-  ordering.AddParameterBlockToGroup(x + 2, 1);
-  ordering.AddParameterBlockToGroup(x, 1);
-
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-
-  ordering.AddParameterBlockToGroup(x, 5);
-  ordering.AddParameterBlockToGroup(x + 1, 5);
-  ordering.AddParameterBlockToGroup(x + 2, 5);
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 0);
-  EXPECT_EQ(ordering.GroupSize(5), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 5);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 5);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 5);
-}
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/solver_impl.cc b/internal/ceres/solver_impl.cc
index 4f914fa..c052aeb 100644
--- a/internal/ceres/solver_impl.cc
+++ b/internal/ceres/solver_impl.cc
@@ -41,7 +41,7 @@
 #include "ceres/linear_solver.h"
 #include "ceres/map_util.h"
 #include "ceres/minimizer.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/parameter_block.h"
 #include "ceres/problem.h"
 #include "ceres/problem_impl.h"
@@ -260,15 +260,15 @@
       LOG(WARNING) << summary->error;
       return;
     }
-    options.ordering = new Ordering(*original_options.ordering);
+    options.ordering = new ParameterBlockOrdering(*original_options.ordering);
   } else {
-    options.ordering = new Ordering;
+    options.ordering = new ParameterBlockOrdering;
     const ProblemImpl::ParameterMap& parameter_map =
         problem_impl->parameter_map();
     for (ProblemImpl::ParameterMap::const_iterator it = parameter_map.begin();
          it != parameter_map.end();
          ++it) {
-      options.ordering->AddParameterBlockToGroup(it->first, 0);
+      options.ordering->AddElementToGroup(it->first, 0);
     }
   }
 
@@ -334,7 +334,7 @@
   // Only Schur types require the lexicographic reordering.
   if (IsSchurType(options.linear_solver_type)) {
     const int num_eliminate_blocks =
-        options.ordering->group_id_to_parameter_blocks().begin()->second.size();
+        options.ordering->group_to_elements().begin()->second.size();
     if (!LexicographicallyOrderResidualBlocks(num_eliminate_blocks,
                                               reduced_program.get(),
                                               &summary->error)) {
@@ -415,7 +415,7 @@
 bool SolverImpl::IsOrderingValid(const Solver::Options& options,
                                  const ProblemImpl* problem_impl,
                                  string* error) {
-  if (options.ordering->NumParameterBlocks() !=
+  if (options.ordering->NumElements() !=
       problem_impl->NumParameterBlocks()) {
       *error = "Number of parameter blocks in user supplied ordering "
           "does not match the number of parameter blocks in the problem";
@@ -428,8 +428,7 @@
   for (vector<ParameterBlock*>::const_iterator it = parameter_blocks.begin();
        it != parameter_blocks.end();
        ++it) {
-    if (!options.ordering->ContainsParameterBlock(
-            const_cast<double*>((*it)->user_state()))) {
+    if (!options.ordering->IsMember(const_cast<double*>((*it)->user_state()))) {
       *error = "Problem contains a parameter block that is not in "
           "the user specified ordering.";
       return false;
@@ -439,7 +438,7 @@
   if (IsSchurType(options.linear_solver_type) &&
       options.ordering->NumGroups() > 1) {
     const set<double*>& e_blocks  =
-        options.ordering->group_id_to_parameter_blocks().begin()->second;
+        options.ordering->group_to_elements().begin()->second;
     if (!IsParameterBlockSetIndependent(e_blocks, residual_blocks)) {
       *error = "The user requested the use of a Schur type solver. "
           "But the first elimination group in the ordering is not an "
@@ -478,7 +477,7 @@
 // Strips varying parameters and residuals, maintaining order, and updating
 // num_eliminate_blocks.
 bool SolverImpl::RemoveFixedBlocksFromProgram(Program* program,
-                                              Ordering* ordering,
+                                              ParameterBlockOrdering* ordering,
                                               double* fixed_cost,
                                               string* error) {
   vector<ParameterBlock*>* parameter_blocks =
@@ -547,7 +546,7 @@
       if (parameter_block->index() == 1) {
         (*parameter_blocks)[j++] = parameter_block;
       } else {
-        ordering->RemoveParameterBlock(parameter_block->mutable_user_state());
+        ordering->Remove(parameter_block->mutable_user_state());
       }
     }
     parameter_blocks->resize(j);
@@ -568,10 +567,10 @@
   CHECK_NOTNULL(options->ordering);
   Program* original_program = problem_impl->mutable_program();
   scoped_ptr<Program> transformed_program(new Program(*original_program));
-  Ordering* ordering = options->ordering;
+  ParameterBlockOrdering* ordering = options->ordering;
 
   const int min_group_id =
-      ordering->group_id_to_parameter_blocks().begin()->first;
+      ordering->group_to_elements().begin()->first;
   const int original_num_groups = ordering->NumGroups();
 
   if (!RemoveFixedBlocksFromProgram(transformed_program.get(),
@@ -603,7 +602,7 @@
         << "to the developers.";
 
     for (int i = 0; i < schur_ordering.size(); ++i) {
-      ordering->AddParameterBlockToGroup(schur_ordering[i]->mutable_user_state(),
+      ordering->AddElementToGroup(schur_ordering[i]->mutable_user_state(),
                                          (i < num_eliminate_blocks) ? 0 : 1);
     }
   }
@@ -764,7 +763,7 @@
 
   linear_solver_options.use_block_amd = options->use_block_amd;
   const map<int, set<double*> >& groups =
-      options->ordering->group_id_to_parameter_blocks();
+      options->ordering->group_to_elements();
   for (map<int, set<double*> >::const_iterator it = groups.begin();
        it != groups.end();
        ++it) {
@@ -783,15 +782,15 @@
 }
 
 bool SolverImpl::ApplyUserOrdering(const ProblemImpl::ParameterMap& parameter_map,
-                                   const Ordering* ordering,
+                                   const ParameterBlockOrdering* ordering,
                                    Program* program,
                                    string* error) {
-  if (ordering->NumParameterBlocks() != program->NumParameterBlocks()) {
+  if (ordering->NumElements() != program->NumParameterBlocks()) {
     *error = StringPrintf("User specified ordering does not have the same "
                           "number of parameters as the problem. The problem"
                           "has %d blocks while the ordering has %d blocks.",
                           program->NumParameterBlocks(),
-                          ordering->NumParameterBlocks());
+                          ordering->NumElements());
     return false;
   }
 
@@ -800,7 +799,7 @@
   parameter_blocks->clear();
 
   const map<int, set<double*> >& groups =
-      ordering->group_id_to_parameter_blocks();
+      ordering->group_to_elements();
 
   for (map<int, set<double*> >::const_iterator group_it = groups.begin();
        group_it != groups.end();
@@ -934,7 +933,7 @@
   evaluator_options.num_eliminate_blocks =
       (options.ordering->NumGroups() > 0 &&
        IsSchurType(options.linear_solver_type))
-      ? options.ordering->group_id_to_parameter_blocks().begin()->second.size()
+      ? options.ordering->group_to_elements().begin()->second.size()
       : 0;
   evaluator_options.num_threads = options.num_threads;
   return Evaluator::Create(evaluator_options, program, error);
diff --git a/internal/ceres/solver_impl.h b/internal/ceres/solver_impl.h
index eb81696..140de95 100644
--- a/internal/ceres/solver_impl.h
+++ b/internal/ceres/solver_impl.h
@@ -34,12 +34,11 @@
 #include <string>
 #include <vector>
 #include "ceres/internal/port.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/solver.h"
 #include "ceres/problem_impl.h"
 
 namespace ceres {
-class Ordering;
-
 namespace internal {
 
 class Evaluator;
@@ -79,7 +78,7 @@
   // return value of true indicates success and false indicates an
   // error was encountered whose cause is logged to LOG(ERROR).
   static bool ApplyUserOrdering(const ProblemImpl::ParameterMap& parameter_map,
-                                const Ordering* ordering,
+                                const ParameterBlockOrdering* ordering,
                                 Program* program,
                                 string* error);
 
@@ -116,7 +115,7 @@
   // NULL, the residual blocks that are removed are evaluated and the
   // sum of their cost is returned in fixed_cost.
   static bool RemoveFixedBlocksFromProgram(Program* program,
-                                           Ordering* ordering,
+                                           ParameterBlockOrdering* ordering,
                                            double* fixed_cost,
                                            string* error);
 
diff --git a/internal/ceres/solver_impl_test.cc b/internal/ceres/solver_impl_test.cc
index 3148024..5f4a82c 100644
--- a/internal/ceres/solver_impl_test.cc
+++ b/internal/ceres/solver_impl_test.cc
@@ -31,7 +31,7 @@
 #include "gtest/gtest.h"
 #include "ceres/autodiff_cost_function.h"
 #include "ceres/linear_solver.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/parameter_block.h"
 #include "ceres/problem_impl.h"
 #include "ceres/program.h"
@@ -88,10 +88,10 @@
 
   string error;
   {
-    Ordering ordering;
-    ordering.AddParameterBlockToGroup(&x, 0);
-    ordering.AddParameterBlockToGroup(&y, 0);
-    ordering.AddParameterBlockToGroup(&z, 0);
+    ParameterBlockOrdering ordering;
+    ordering.AddElementToGroup(&x, 0);
+    ordering.AddElementToGroup(&y, 0);
+    ordering.AddElementToGroup(&z, 0);
 
     Program program(*problem.mutable_program());
     EXPECT_TRUE(SolverImpl::RemoveFixedBlocksFromProgram(&program,
@@ -100,7 +100,7 @@
                                                          &error));
     EXPECT_EQ(program.NumParameterBlocks(), 3);
     EXPECT_EQ(program.NumResidualBlocks(), 3);
-    EXPECT_EQ(ordering.NumParameterBlocks(), 3);
+    EXPECT_EQ(ordering.NumElements(), 3);
   }
 }
 
@@ -112,8 +112,8 @@
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &x);
   problem.SetParameterBlockConstant(&x);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
 
   Program program(problem.program());
   string error;
@@ -123,7 +123,7 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 0);
   EXPECT_EQ(program.NumResidualBlocks(), 0);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 0);
+  EXPECT_EQ(ordering.NumElements(), 0);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksNoResidualBlocks) {
@@ -136,10 +136,10 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 0);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 0);
 
 
   Program program(problem.program());
@@ -150,7 +150,7 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 0);
   EXPECT_EQ(program.NumResidualBlocks(), 0);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 0);
+  EXPECT_EQ(ordering.NumElements(), 0);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksOneParameterBlockConstant) {
@@ -163,10 +163,10 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 0);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 0);
 
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &x);
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
@@ -181,7 +181,7 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 1);
   EXPECT_EQ(program.NumResidualBlocks(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 1);
+  EXPECT_EQ(ordering.NumElements(), 1);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksNumEliminateBlocks) {
@@ -198,10 +198,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
   problem.SetParameterBlockConstant(&x);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 1);
 
   Program program(problem.program());
   string error;
@@ -211,9 +211,9 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 2);
   EXPECT_EQ(program.NumResidualBlocks(), 2);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 2);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&y), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&z), 1);
+  EXPECT_EQ(ordering.NumElements(), 2);
+  EXPECT_EQ(ordering.GroupId(&y), 0);
+  EXPECT_EQ(ordering.GroupId(&z), 1);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksFixedCost) {
@@ -230,10 +230,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
   problem.SetParameterBlockConstant(&x);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 1);
 
   double fixed_cost = 0.0;
   Program program(problem.program());
@@ -250,9 +250,9 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 2);
   EXPECT_EQ(program.NumResidualBlocks(), 2);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 2);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&y), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&z), 1);
+  EXPECT_EQ(ordering.NumElements(), 2);
+  EXPECT_EQ(ordering.GroupId(&y), 0);
+  EXPECT_EQ(ordering.GroupId(&z), 1);
   EXPECT_DOUBLE_EQ(fixed_cost, expected_fixed_cost);
 }
 
@@ -273,10 +273,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &y);
 
-  Ordering* ordering = new Ordering;
-  ordering->AddParameterBlockToGroup(&x, 0);
-  ordering->AddParameterBlockToGroup(&y, 0);
-  ordering->AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering* ordering = new ParameterBlockOrdering;
+  ordering->AddElementToGroup(&x, 0);
+  ordering->AddElementToGroup(&y, 0);
+  ordering->AddElementToGroup(&z, 1);
 
   Solver::Options options;
   options.linear_solver_type = DENSE_SCHUR;
@@ -335,10 +335,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &z);  // 6 x
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &y);       // 7
 
-  Ordering* ordering = new Ordering;
-  ordering->AddParameterBlockToGroup(&x, 0);
-  ordering->AddParameterBlockToGroup(&z, 0);
-  ordering->AddParameterBlockToGroup(&y, 1);
+  ParameterBlockOrdering* ordering = new ParameterBlockOrdering;
+  ordering->AddElementToGroup(&x, 0);
+  ordering->AddElementToGroup(&z, 0);
+  ordering->AddElementToGroup(&y, 1);
 
   Solver::Options options;
   options.linear_solver_type = DENSE_SCHUR;
@@ -396,9 +396,9 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 1);
 
   Program program(problem.program());
   string error;
@@ -418,10 +418,10 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 2);
-  ordering.AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 2);
+  ordering.AddElementToGroup(&z, 1);
 
   Program* program = problem.mutable_program();
   string error;
@@ -452,7 +452,7 @@
   options.linear_solver_type = DENSE_QR;
   options.linear_solver_max_num_iterations = -1;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
             static_cast<LinearSolver*>(NULL));
@@ -463,7 +463,7 @@
   options.linear_solver_type = DENSE_QR;
   options.linear_solver_min_num_iterations = -1;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
             static_cast<LinearSolver*>(NULL));
@@ -474,7 +474,7 @@
   options.linear_solver_type = DENSE_QR;
   options.linear_solver_min_num_iterations = 10;
   options.linear_solver_max_num_iterations = 5;
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
             static_cast<LinearSolver*>(NULL));
@@ -486,11 +486,11 @@
   options.num_linear_solver_threads = 2;
   // The Schur type solvers can only be created with the Ordering
   // contains at least one elimination group.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   double x;
   double y;
-  options.ordering->AddParameterBlockToGroup(&x, 0);
-  options.ordering->AddParameterBlockToGroup(&y, 0);
+  options.ordering->AddElementToGroup(&x, 0);
+  options.ordering->AddElementToGroup(&y, 0);
 
   string error;
   scoped_ptr<LinearSolver> solver(
@@ -504,7 +504,7 @@
   Solver::Options options;
   options.trust_region_strategy_type = DOGLEG;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   options.linear_solver_type = ITERATIVE_SCHUR;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
@@ -520,7 +520,7 @@
   scoped_ptr<LinearSolver> solver;
   options.linear_solver_type = DENSE_QR;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   solver.reset(SolverImpl::CreateLinearSolver(&options, &error));
   EXPECT_EQ(options.linear_solver_type, DENSE_QR);
@@ -549,8 +549,8 @@
 
   double x;
   double y;
-  options.ordering->AddParameterBlockToGroup(&x, 0);
-  options.ordering->AddParameterBlockToGroup(&y, 0);
+  options.ordering->AddElementToGroup(&x, 0);
+  options.ordering->AddElementToGroup(&y, 0);
 
   options.linear_solver_type = DENSE_SCHUR;
   solver.reset(SolverImpl::CreateLinearSolver(&options, &error));
diff --git a/internal/ceres/system_test.cc b/internal/ceres/system_test.cc
index 4d78de7..8f1722a 100644
--- a/internal/ceres/system_test.cc
+++ b/internal/ceres/system_test.cc
@@ -44,7 +44,7 @@
 #include <string>
 
 #include "ceres/autodiff_cost_function.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/problem.h"
 #include "ceres/rotation.h"
 #include "ceres/solver.h"
@@ -387,15 +387,15 @@
       problem_.AddResidualBlock(cost_function, NULL, camera, point);
     }
 
-    options_.ordering = new Ordering;
+    options_.ordering = new ParameterBlockOrdering;
 
     // The points come before the cameras.
     for (int i = 0; i < num_points_; ++i) {
-      options_.ordering->AddParameterBlockToGroup(points + 3 * i, 0);
+      options_.ordering->AddElementToGroup(points + 3 * i, 0);
     }
 
     for (int i = 0; i < num_cameras_; ++i) {
-      options_.ordering->AddParameterBlockToGroup(cameras + 9 * i, 1);
+      options_.ordering->AddElementToGroup(cameras + 9 * i, 1);
     }
 
     options_.max_num_iterations = 25;
